xend: Set default vcpu affinity for better performance in NUMA systems.
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 27 Feb 2008 13:17:49 +0000 (13:17 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 27 Feb 2008 13:17:49 +0000 (13:17 +0000)
Signed-off-by: Duan Ronghui <ronghui.duan@intel.com>
tools/python/xen/xend/XendDomainInfo.py

index 9ff2146ea4086ac8c66caa2ca82ed730959bca95..b189a9f27a3ab38951005a650151a190080f567f 100644 (file)
@@ -1963,6 +1963,39 @@ class XendDomainInfo:
             if self.info['cpus'] is not None and len(self.info['cpus']) > 0:
                 for v in range(0, self.info['VCPUs_max']):
                     xc.vcpu_setaffinity(self.domid, v, self.info['cpus'])
+            else:
+                info = xc.physinfo()
+                if info['nr_nodes'] > 1:
+                    node_memory_list = info['node_to_memory']
+                    needmem = self.image.getRequiredAvailableMemory(self.info['memory_dynamic_max']) / 1024
+                    candidate_node_list = []
+                    for i in range(0, info['nr_nodes']):
+                        if node_memory_list[i] >= needmem:
+                            candidate_node_list.append(i)
+                    if candidate_node_list is None or len(candidate_node_list) == 1:
+                        index = node_memory_list.index( max(node_memory_list) )
+                        cpumask = info['node_to_cpu'][index]
+                    else:
+                        nodeload = [0]
+                        nodeload = nodeload * info['nr_nodes']
+                        from xen.xend import XendDomain
+                        doms = XendDomain.instance().list('all')
+                        for dom in doms:
+                            cpuinfo = dom.getVCPUInfo()
+                            for vcpu in sxp.children(cpuinfo, 'vcpu'):
+                                def vinfo(n, t):
+                                    return t(sxp.child_value(vcpu, n))
+                                cpumap = vinfo('cpumap', list)
+                                for i in candidate_node_list:
+                                    node_cpumask = info['node_to_cpu'][i]
+                                    for j in node_cpumask:
+                                        if j in cpumap:
+                                            nodeload[i] += 1
+                                            break
+                        index = nodeload.index( min(nodeload) )
+                        cpumask = info['node_to_cpu'][index]
+                    for v in range(0, self.info['VCPUs_max']):
+                        xc.vcpu_setaffinity(self.domid, v, cpumask)
 
             # Use architecture- and image-specific calculations to determine
             # the various headrooms necessary, given the raw configured